import Vue from 'vue';
import router from './router';
import store from './store';
import { ACCESS_TOKEN } from './store/modules/mutation-types';

router.beforeEach((to,from,next)=>{
    if(Vue.ls.get(ACCESS_TOKEN)){
        if(to.path === '/login'){
            next({path:'/desk/desktop'});
        }else{
          if(store.getters.firstInter){
            next();
          }else{
            store.dispatch('addAllRoutes',{}).then(() => {
              router.addRoutes(store.getters.addRouters);
              const redirect = decodeURIComponent(from.query.redirect || to.path);
              store.commit("SET_INTER", true);
              next({ path: to.path });
              // if (to.path === redirect) {
              //     // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
              //     next({ ...to, replace: true });
              // } else {
              //     // 跳转到目的路由
              //     next({ path: redirect });
              // }
          }).catch(() => {
              alert("登陆失败，请重试");
          })
          }
        }
    } else {
        if(to.path === '/login'){
            next();
        }else{
            next({ path: '/login', query: { redirect: to.fullPath } });
        }
    }
})
router.afterEach(() => {
})

/**
 * Action 权限指令
 * 指令用法：
 *  - 在需要控制 action 级别权限的组件上使用 v-action:[method] , 如下：
 *    <i-button v-action:add >添加用户</a-button>
 *    <a-button v-action:delete>删除用户</a-button>
 *    <a v-action:edit @click="edit(record)">修改</a>
 *
 *  - 当前用户没有权限时，组件上使用了该指令则会被隐藏
 *  - 当后台权限跟 pro 提供的模式不同时，只需要针对这里的权限过滤进行修改即可
 *
 */
const action = Vue.directive('action', {
    bind: function (el, binding, vnode) {
      const actionName = binding.arg
      const roles = store.getters.roles
      const elVal = vnode.context.$route.meta.permission
      const permissionId = elVal instanceof String && [elVal] || elVal
      roles.permissions.forEach(p => {
        if (!permissionId.includes(p.permissionId)) {
          return
        }
        if (p.actionList && !p.actionList.includes(actionName)) {
          el.parentNode && el.parentNode.removeChild(el) || (el.style.display = 'none')
        }
      })
    }
  })

  export {
    action
  }
  